import java.util.HashMap;
import java.util.Map;

public class TwoSum {
    /**
     * 查找数组中和为目标值的两个数的下标
     * @param nums 整数数组
     * @param target 目标值
     * @return 包含两个数下标的数组
     */
    public int[] twoSum(int[] nums, int target) {
        // 创建哈希表，键为数字，值为该数字在数组中的下标
        Map<Integer, Integer> numMap = new HashMap<>();
        
        // 遍历数组
        for (int i = 0; i < nums.length; i++) {
            // 计算互补值
            int complement = target - nums[i];
            
            // 检查哈希表中是否存在互补值
            if (numMap.containsKey(complement)) {
                // 如果存在，返回两个数的下标
                return new int[] { numMap.get(complement), i };
            }
            
            // 将当前数字及其下标存入哈希表
            numMap.put(nums[i], i);
        }
        
        // 根据题意，每种输入只会对应一个答案，所以不应该到达这里
        // 如果没有找到答案，返回一个空数组
        return new int[0];
    }
    
    // 打印结果的方法
    public static void printResult(int[] result) {
        System.out.println("[" + result[0] + ", " + result[1] + "]");
    }
    
    // 打印数组的方法
    public static void printArray(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]);
            if (i < arr.length - 1) {
                System.out.print(", ");
            }
        }
        System.out.println("]");
    }
    
    // 主方法，用于测试
    public static void main(String[] args) {
        TwoSum solution = new TwoSum();
        
        System.out.println("=== 两数之和问题测试 ===");
        
        // 测试用例1
        int[] nums1 = {2, 7, 11, 15};
        int target1 = 9;
        System.out.print("测试用例1: 数组 = ");
        printArray(nums1);
        System.out.println("目标值 = " + target1);
        System.out.print("结果: ");
        printResult(solution.twoSum(nums1, target1)); // 预期输出: [0, 1]
        
        // 测试用例2
        int[] nums2 = {3, 2, 4};
        int target2 = 6;
        System.out.print("\n测试用例2: 数组 = ");
        printArray(nums2);
        System.out.println("目标值 = " + target2);
        System.out.print("结果: ");
        printResult(solution.twoSum(nums2, target2)); // 预期输出: [1, 2]
        
        // 测试用例3
        int[] nums3 = {3, 3};
        int target3 = 6;
        System.out.print("\n测试用例3: 数组 = ");
        printArray(nums3);
        System.out.println("目标值 = " + target3);
        System.out.print("结果: ");
        printResult(solution.twoSum(nums3, target3)); // 预期输出: [0, 1]
        
        // 测试用例4 - 更复杂的数组
        int[] nums4 = {-1, -2, -3, -4, -5};
        int target4 = -8;
        System.out.print("\n测试用例4: 数组 = ");
        printArray(nums4);
        System.out.println("目标值 = " + target4);
        System.out.print("结果: ");
        printResult(solution.twoSum(nums4, target4)); // 预期输出: [2, 4]
    }
}
